2328
9161
我不确定如何真正地把我的问题变成单词,所以让我尝试用一​​个例子来解释一下:
假设我的程序在执行特定操作时遇到一些奇怪的行为。我已经找到了一些导致这种奇怪行为的代码。禁用此序列时,我不会遇到此行为。不幸的是,我需要这段代码,因为那时其他功能无法正常工作。
因此,我接下来要做的是弄清楚为什么该代码摘录处于活动状态时某些东西会有所不同。
为了更好地了解发生了什么,我有时想运行包括“错误代码”在内的整个动作,有时甚至没有。然后,我可以比较结果,例如UI中发生的情况或函数返回的结果。
我想到的第一种方法是在启用代码的情况下运行程序,执行所需的操作,然后停止程序,注释掉代码,重新编译并再次运行。嗯...听起来很蠢。特别是如果我再次需要打开该代码以再次查看其他行为,然后再次将其关闭,然后再打开,再关闭等等。
我不能选择使用断点并影响语句顺序或修改值,以便我运行或不运行if语句,for循环等。两个示例:
我调试了时序关键行为,并且当我暂停程序时,时序发生了显着变化。因此,我可以设置的第一个断点必须在操作结束时。 1个
我希望将焦点放在VS时会出现“被抑制”的工具提示或其他窗口。因此,我根本不能使用任何断点。无论是在行动的开始还是结束都没有。1
Visual Studio 2012中是否有任何技术可以让我将此代码标记为可选代码,并且可以在执行操作之前决定是否要运行此代码序列?我在更高层次上想到了类似if(true | false)的东西。
我不是在寻找需要重新运行程序几次的解决方案。在那种情况下,我仍然可以使用简单的方法,即使用#if false注释掉代码。
1请注意,当我需要在特定位置查看特定变量时(如果尚未将值写入输出),我当然可以设置断点,但是会再次关闭断点以一次执行整个操作走。 
在Visual Studio调试器中,您可以在“相关代码”的前面设置一个断点。当代码在此时停止时,您可以选择使其继续运行,也可以右键单击任何其他行并选择Set Next Statement。
这是一个很奇怪的选择,但是我开始欣赏它。
|
我能想到的唯一选择是在UI中添加仅在调试时显示的内容,从而为您提供包括/排除相关操作的选项。
在使用它时,您可能还希望通过UI将应用程序重置为“已知状态”。
|
我在更高层次上想到了类似if(true | false)的东西。
为什么要“更高层次”?为什么不使用这个呢?
您希望有时执行一段代码,有时不执行,并且应该在运行时而不是在编译时更改开关-这显然导致
如果(条件)
{
//相关代码
}
这里要注意的是您将使用哪种条件-可能是在代码的发行版本中将其设置为true的变量,有时在调试版本中将其设置为false的变量。值可能是从配置文件中获取的,也可能是环境变量中的获取的,可能是程序中的某种逻辑计算出来的,无论何时何地。
编辑:您还可以在条件代码中引入一个布尔变量,默认情况下将其初始化为true,并在需要时使用调试器更改其值。
|
预处理程序指令可能就是您所追求的。它们是供编译器执行的部分代码,可以通过以#字符开头来识别(从风格上讲,默认情况下,它们不遵循代码的缩进模式,而是始终牢固地位于编辑器的左边缘):
#定义INCLUDE_DODGY_CODE
公共无效MyMethodWithDodgyBits(){
#if INCLUDE_DODGY_CODE
myDodgyMethod();
#万一
myOkMethod();
}
在这种情况下,如果包含#define INCLUDE_DODGY_CODE,则myDodgyMethod()调用将被编译到您的程序中。否则,编译器将跳过该调用,并且该调用将根本不存在于您的二进制文件中。
|
您可以根据需要提供几个调试选项。
Visual Studio有许多选项可直接浏览代码。您可以使用“设置下一条语句”功能直接移至特定语句。您还可以通过“即时窗口”,“快速监视”和在调试时将鼠标悬停在变量上的工具提示直接编辑值。
Visual Studio还具有回放执行历史记录的功能。看一下IntelliTrace入门。当您有多个关注的领域正在相互作用并产生错误情况时,这将很有帮助。
您还可以将代码段包装在条件块中,并适当地设置条件变量。可能是在调试时,也可能是通过配置文件传递参数。如果要排除许多语句,使用条件检查可能比手动单步执行代码更容易。
|
有时取决于VS的版本和语言,但是您可以愉快地编辑代码(将其注释掉,或将其包装在大的#ifdef 0中),然后按alt + F10键,编译器将重新编译,重新链接并继续执行好像您永远不会摆弄它。
但是,尽管在VC ++中效果很好(自VS v6 IIRC起),但C#可能会出现问题-我发现(对于VS2010)我无法编辑并继续使用包含任何lambda(主要是linq)语句和64位代码的函数从来没有这样做过。仍然值得尝试,因为有时它确实很有用。
|
我处理的应用程序具有仅用于调试的可选代码,这些代码不应出现在生产环境中。这部分可选代码对我们来说最容易使用配置文件进行控制,因为它不需要重新编译即可更改。
这样的修复可能并不能最终解决您的最终结果,但是在找到修复程序之前,它可能有助于解决问题。如果您有多个需要组合测试的可选部分,则此修复方式可能需要在配置文件中使用多个键,这可能是一个缺点,而且很难跟踪。
|
您的问题并不十分清楚,这可能就是为什么您认为无效答案如此之多的原因。如果似乎没有人能够回答该问题,则可能需要考虑对其重新措辞。
冒着给出另一个无效答案的风险,我将添加一些有关过去如何处理该问题的信息。
最简单的方法是在其中放置任何可选代码
#if调试
//这里是可选代码
#万一
这样,当您在调试模式下运行时,代码便已实现,而当您在发布模式下运行时,代码就没有实现。在两者之间切换需要单击一个按钮。
我还通过一个简单的标志以类似的方式解决了相同的问题:
bool runOptionalCode = false;
然后
如果(runOptionalCode)
{
//在此处放置可选代码
}
再次,在模式之间切换需要更改一个单词,因此是一项简单的任务。您在问题中提到了这一点,但由于不清楚的原因而将其打折。正如我所说,在两者之间切换几乎不需要付出任何努力。
如果您需要在运行时在代码之间进行更改,最好的方法是使用UI项或击键来修改上面示例中提到的标志。但是,根据您的应用程序,这可能会花费更多的精力。过去,我发现当我已经将键侦听器作为项目的一部分实现时,有几个键可以决定是否运行调试(可选)代码效果最佳。在没有关键侦听器的应用程序中,我宁愿使用以前的方法之一。
|
你的答案
StackExchange.ifUsing(“ editor”,function(){
StackExchange.using(“ externalEditor”,function(){
StackExchange.using(“ snippets”,function(){
StackExchange.snippets.init();
});
});
},“代码段”);
StackExchange.ready(function(){
var channelOptions = {
标签:“” .split(“”),
id:“ 1”
};
initTagRenderer(“”。split(“”),“” .split(“”),channelOptions);
StackExchange.using(“ externalEditor”,function(){
//如果启用了摘要,则必须在摘要后触发编辑器
如果(StackExchange.settings.snippets.snippetsEnabled){
StackExchange.using(“ snippets”,function(){
createEditor();
});
}
其他{
createEditor();
}
});
函数createEditor(){
StackExchange.prepareEditor({
useStacksEditor:否,
heartbeatType:“答案”,
autoActivateHeartbeat:否,
convertImagesToLinks:是,
noModals:是的,
showLowRepImageUploadWarning:是的,
声望:ToPostImages:10,
bindNavPrevention:是的,
后缀:“”,
imageUploader:{
brandingHtml:“采用\ u003ca href = \“ https://imgur.com/ \” \ u003e \ u003csvg class = \“ svg-icon \” width = \“ 50 \” height = \“ 18 \” viewBox = \“ 0 0 50 18 \” fill = \“ none \” xmlns = \“ http://www.w3.org/2000/svg \” \ u003e \ u003cpath d = \“ M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.91628 46.0943 5.50789C45.74.6 4.313.6412 4.313.6662 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \“ / \ u003e \ u003cpath d = \” M32.492 10.1419C32.492 12.6954 34.1182 14.048437.0451 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.4954 10.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \“ / \ u003e \ u003cpath fill-rule = \” evenodd \“ clip-rule =” \ evenodd \“ d = \“ M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C6.723 4.5608.787 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.14.8349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \“ / \ u003e \ u003cpath d = \” M16.8045 11.9512C16.8045 13.2535 17.2637 13.89629.31965 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 4.792866 5.3279 6.523506 4.662 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893 7.58817 10.893 8.9410811.93.8962 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \“ / \ u003e \ u003cpath d = \“ M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.3167513.2535 3.31675 11.9512V6.59049Z \“ / \ u003e \ u003cpath d = \” M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.4 0.400291Z \“ fill = \”#1BB76E \“ / \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e”,
contentPolicyHtml:“根据\ u003ca href = \“ https://stackoverflow.com/help/licensing \” \ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \“ https://stackoverflow.com获得许可的用户贡献/ legal / content-policy \“ \ u003e(内容策略)\ u003c / a \ u003e”,
allowUrls:是
},
onDemand:是的,
dispatchSelector:“。discard-answer”
,immediatelyShowMarkdownHelp:true,enableSnippets:true
});
}
});
感谢您为Stack Overflow提供答案!
请务必回答问题。提供详细信息并分享您的研究!
但是要避免...
寻求帮助,澄清或回答其他答案。
根据意见发表声明;用参考或个人经验来备份它们。
要了解更多信息,请参见有关编写出色答案的提示。
草稿已保存
草稿丢弃
注册或登录
StackExchange.ready(function(){
StackExchange.helpers.onClickDraftSave('#login-link');
});
使用Google注册
使用Facebook注册
使用电子邮件和密码注册
提交
以访客身份发布
名称
电子邮件
必需,但从未显示
StackExchange.ready(
函数(){
StackExchange.openid.initPostLogin('。new-post-login','https%3a%2f%2fstackoverflow.com%2fquestions%2f19425104%2fcan-i-mark-some-code-as-Optional-while-debugging-in visual-studio-2012%23new-answer”,“ question_page”);
}
);
以访客身份发布
名称
电子邮件
必需,但从未显示
发表您的答案
丢弃
点击“发布答案”,即表示您同意我们的服务条款,隐私政策和Cookie政策
不是您要找的答案?浏览标记为debug visual-studio的其他问题,或者提出您自己的问题。